home *** CD-ROM | disk | FTP | other *** search
/ Aminet 39 / Aminet 39 (2000)(Schatztruhe)[!][Oct 2000].iso / Aminet / game / shoot / Orbit_src.lha / Orbit / source / event.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-07-04  |  8.8 KB  |  431 lines

  1. /*
  2.     Amiga port by Oliver Gantert
  3.  
  4.     27.04.2000 - fixed some compiler warnings, cleanup up
  5.                  ResetEvents() and FindEvent()
  6. */
  7. /*
  8.  
  9. ORBIT, a freeware space combat simulator
  10. Copyright (C) 1999  Steve Belczyk <steve1@genesis.nred.ma.us>
  11.  
  12. This program is free software; you can redistribute it and/or
  13. modify it under the terms of the GNU General Public License
  14. as published by the Free Software Foundation; either version 2
  15. of the License, or (at your option) any later version.
  16.  
  17. This program is distributed in the hope that it will be useful,
  18. but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20. GNU General Public License for more details.
  21.  
  22. You should have received a copy of the GNU General Public License
  23. along with this program; if not, write to the Free Software
  24. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  25.  
  26. */
  27.  
  28. #include "orbit.h"
  29.  
  30. /*
  31.  *  Stuff to implement events
  32.  */
  33.  
  34. void InitEvents ()
  35. /*
  36.  *  Initialize events
  37.  */
  38. {
  39.   int e, a;
  40.  
  41.   for (e=0; e<NEVENTS; e++)
  42.   {
  43.     event[e].name[0] = 0;
  44.     event[e].pending = 0;
  45.     event[e].enabled = 1;
  46.     event[e].trigger = EVENT_NULL;
  47.     event[e].ivalue = 0;
  48.     event[e].fvalue = 0.0;
  49.     event[e].cvalue = NULL;
  50.     event[e].pos[0] = event[e].pos[1] = event[e].pos[2] = 0.0;
  51.  
  52.     for (a=0; a<ACTIONS_PER_EVENT; a++)
  53.     {
  54.       event[e].action[a].active = 0;
  55.       event[e].action[a].action = EVENT_NULL;
  56.       event[e].action[a].ivalue = 0;
  57.       event[e].action[a].fvalue = 0.0;
  58.       event[e].action[a].cvalue = NULL;
  59.     }
  60.   }
  61. }
  62.  
  63. void ResetEvents ()
  64. /*
  65.  *  Re-Initialize events
  66.  */
  67. {
  68.   int e, a;
  69.  
  70.   for (e=0; e<NEVENTS; e++)
  71.   {
  72.     event[e].name[0] = 0;
  73.     event[e].pending = 0;
  74.     event[e].enabled = 1;
  75.     event[e].trigger = EVENT_NULL;
  76.     if (event[e].cvalue)
  77.     {
  78.       free (event[e].cvalue);
  79.       event[e].cvalue = NULL;
  80.     }
  81.     event[e].ivalue = 0;
  82.     event[e].fvalue = 0.0;
  83.     event[e].pos[0] = event[e].pos[1] = event[e].pos[2] = 0.0;
  84.  
  85.     for (a=0; a<ACTIONS_PER_EVENT; a++)
  86.     {
  87.       event[e].action[a].active = 0;
  88.       event[e].action[a].action = EVENT_NULL;
  89.       event[e].action[a].ivalue = 0;
  90.       event[e].action[a].fvalue = 0.0;
  91.       if (event[e].action[a].cvalue)
  92.       {
  93.         free (event[e].action[a].cvalue);
  94.         event[e].action[a].cvalue = NULL;
  95.       }
  96.     }
  97.   }
  98. }
  99.  
  100. int FindEvent()
  101. /*
  102.  *  Find unused event
  103.  */
  104. {
  105.   int e, a;
  106.  
  107.   for (e=0; e<NEVENTS; e++)
  108.   {
  109.     if (!event[e].pending)
  110.     {
  111.       event[e].pending = 1;
  112.       event[e].enabled = 1;
  113.  
  114.       /* Free any memory previously used by this event */
  115.       if (event[e].cvalue)
  116.       {
  117.         free (event[e].cvalue);
  118.         event[e].cvalue = NULL;
  119.       }
  120.  
  121.       for (a=0; a<ACTIONS_PER_EVENT; a++)
  122.       {
  123.         if (event[e].action[a].cvalue)
  124.         {
  125.           free (event[e].action[a].cvalue);
  126.           event[e].action[a].cvalue = NULL;
  127.         }
  128.       }
  129.  
  130.       return (e);
  131.     }
  132.   }
  133.  
  134.   Log ("Out of events!  Increase NEVENTS in orbit.h");
  135.   FinishSound();
  136.   CloseLog();
  137.   exit (0);
  138. }
  139.  
  140. int FindEventByName (char *name)
  141. {
  142.   int e;
  143.  
  144.   for (e=0; e<NEVENTS; e++)
  145.   {
  146.     if (!strcasecmp (name, event[e].name)) return (e);
  147.   }
  148.   return (-1);
  149. }
  150.  
  151. void DoEvents()
  152. /*
  153.  *  Process events
  154.  */
  155. {
  156.   int e;
  157.  
  158.   for (e=0; e<NEVENTS; e++)
  159.   {
  160.     if (event[e].pending && event[e].enabled)
  161.     {
  162.       switch (event[e].trigger)
  163.       {
  164.         case EVENT_NULL:
  165.         break;
  166.  
  167.         case EVENT_TRUE:
  168.         EventAction (e);
  169.         break;
  170.  
  171.         case EVENT_APPROACH:
  172.         EventTrigApproach (e);
  173.         break;
  174.  
  175.         case EVENT_DEPART:
  176.         EventTrigDepart (e);
  177.         break;
  178.  
  179.         case EVENT_DESTROY:
  180.         EventTrigDestroy (e);
  181.         break;
  182.  
  183.         case EVENT_SCORE:
  184.         EventTrigScore (e);
  185.         break;
  186.  
  187.         case EVENT_ALARM:
  188.         EventTrigAlarm (e);
  189.         break;
  190.  
  191.         case EVENT_STOPNEAR:
  192.         EventTrigStopnear (e);
  193.         break;
  194.  
  195.         case EVENT_SHIELDS:
  196.         EventTrigShields (e);
  197.         break;
  198.  
  199.         default:
  200.         Log ("Unknown event trigger type: %d, event %d",
  201.         event[e].trigger, e);
  202.         FinishSound();
  203.         CloseLog();
  204.         exit (0);
  205.         break;
  206.       }
  207.     }
  208.   }
  209. }
  210.  
  211. void EventTrigApproach (int e)
  212. {
  213.   double v[3], r;
  214.  
  215.   /* Find range to destination */
  216.   Vsub (v, event[e].pos, player.pos);
  217.   r = Mag2 (v);
  218.  
  219.   /* There yet? */
  220.   if (r <= event[e].fvalue*event[e].fvalue) EventAction (e);
  221. }
  222.  
  223. void EventTrigStopnear (int e)
  224. {
  225.   double v[3], r;
  226.  
  227.   if ( (player.vel[0] != 0.0) ||
  228.   (player.vel[1] != 0.0) ||
  229.   (player.vel[2] != 0.0) ) return;
  230.  
  231.   /* Find range to destination */
  232.   Vsub (v, event[e].pos, player.pos);
  233.   r = Mag2 (v);
  234.  
  235.   /* There yet? */
  236.   if (r <= event[e].fvalue*event[e].fvalue) EventAction (e);
  237. }
  238.  
  239. void EventTrigDepart (int e)
  240. {
  241.   double v[3], r;
  242.  
  243.   /* Find range to destination */
  244.   Vsub (v, event[e].pos, player.pos);
  245.   r = Mag2 (v);
  246.  
  247.   /* There yet? */
  248.   if (r > event[e].fvalue*event[e].fvalue)
  249.   {
  250.     Log ("EventTrigDepart: r=%lf, fvalue=%lf",
  251.     r, event[e].fvalue);
  252.     EventAction (e);
  253.   }
  254. }
  255.  
  256. void EventTrigDestroy (int e)
  257. /*
  258.  *  Do nothing here -- destroy triggers are checked by
  259.  *  DestroyTarget in target.c
  260.  */
  261. {
  262. }
  263.  
  264. void EventTrigShields (int e)
  265. /*
  266.  *  Not checked here -- checked in MissileHitTarget in missile.c
  267.  */
  268. {
  269. }
  270.  
  271. void EventTrigScore (int e)
  272. {
  273.   if (player.score >= event[e].ivalue) EventAction (e);
  274. }
  275.  
  276. void EventTrigAlarm (int e)
  277. {
  278.   event[e].fvalue -= deltaT;
  279.   if (event[e].fvalue <= 0.0) EventAction (e);
  280. }
  281.  
  282. void EventAction (int e)
  283. /*
  284.  *  Event e has occurred!
  285.  */
  286. {
  287.   int t, ev, a, p;
  288.  
  289.   event[e].pending = 0;
  290.  
  291.   /* Process all action */
  292.   for (a=0; a<ACTIONS_PER_EVENT; a++)
  293.   {
  294.     if (event[e].action[a].active)
  295.     {
  296.       Log ("EventAction: Event %d.%d has happened, trigger %d action %d",
  297.       e, a, event[e].trigger, event[e].action[a].action);
  298.  
  299.       switch (event[e].action[a].action)
  300.       {
  301.         case EVENT_NULL:
  302.         break;
  303.  
  304.         case EVENT_MESSAGE:
  305.         Mprint (event[e].action[a].cvalue);
  306.         break;
  307.  
  308.         case EVENT_HIDE:
  309.         if ((-1) != (t = FindTargetByName (event[e].action[a].cvalue)))
  310.         {
  311.           target[t].hidden = 1;
  312.         }
  313.         break;
  314.  
  315.         case EVENT_UNHIDE:
  316.         if ((-1) != (t = FindTargetByName (event[e].action[a].cvalue)))
  317.         {
  318.           target[t].hidden = 0;
  319.         }
  320.         break;
  321.  
  322.         case EVENT_DESTROY:
  323.         if ((-1) != (t = FindTargetByName (event[e].action[a].cvalue)))
  324.         {
  325.           DestroyTarget (t);
  326.         }
  327.         break;
  328.  
  329.         case EVENT_SCORE:
  330.         player.score += event[e].action[a].ivalue;
  331.         break;
  332.  
  333.         case EVENT_ENABLE:
  334.         if ((-1) != (ev = FindEventByName (event[e].action[a].cvalue)))
  335.         {
  336.           event[ev].enabled = 1;
  337.         }
  338.         break;
  339.  
  340.         case EVENT_DISABLE:
  341.         if ((-1) != (ev = FindEventByName (event[e].action[a].cvalue)))
  342.         {
  343.           event[ev].enabled = 0;
  344.         }
  345.         break;
  346.  
  347.         case EVENT_LOADMISSION:
  348.         Log ("EventAction is calling ReadMission(%s)", event[e].action[a].cvalue);
  349.         ReadMission (event[e].action[a].cvalue);
  350.         return;
  351.  
  352.         case EVENT_STOP:
  353.         player.vel[0] = player.vel[1] = player.vel[2] = 0.0;
  354.         break;
  355.  
  356.         case EVENT_BOOM:
  357.         Boom (event[e].pos, event[e].action[a].fvalue);
  358.         break;
  359.  
  360.         case EVENT_FLASH:
  361.         palette_flash = 1;
  362.         break;
  363.  
  364.         case EVENT_MOVEOBJECT:
  365.         if ((-1) != (t = FindTargetByName (event[e].action[a].cvalue)))
  366.         {
  367.           Vset (target[t].pos, event[e].pos);
  368.         }
  369.         break;
  370.  
  371.         case EVENT_MOVEPLAYER:
  372.         Vset (player.pos, event[e].pos);
  373.         break;
  374.  
  375.         case EVENT_MOVEPLANET:
  376.         if ((-1) != (p = FindPlanetByName (event[e].action[a].cvalue)))
  377.         {
  378.           Vset (planet[p].pos, event[e].pos);
  379.         }
  380.         break;
  381.  
  382.         case EVENT_HIDEPLANET:
  383.         if ((-1) != (p = FindPlanetByName (event[e].action[a].cvalue)))
  384.         {
  385.           planet[p].hidden = 1;
  386.         }
  387.         break;
  388.  
  389.         case EVENT_UNHIDEPLANET:
  390.         if ((-1) != (p = FindPlanetByName (event[e].action[a].cvalue)))
  391.         {
  392.           planet[p].hidden = 0;
  393.         }
  394.         break;
  395.  
  396.         case EVENT_BETRAY:
  397.         if ((-1) != (t = FindTargetByName (event[e].action[a].cvalue)))
  398.         {
  399.           target[t].friendly = !target[t].friendly;
  400.         }
  401.         break;
  402.  
  403.         default:
  404.         Log ("Unknown event action type %d, event %d",
  405.         event[e].action, e);
  406.         FinishSound();
  407.         CloseLog();
  408.         exit (0);
  409.       }
  410.     }
  411.   }
  412.  
  413.   /* Free memory used by this event */
  414.   if (NULL != event[e].cvalue)
  415.   {
  416.     free (event[e].cvalue);
  417.     event[e].cvalue = NULL;
  418.   }
  419.   for (a=0; a<ACTIONS_PER_EVENT; a++)
  420.   {
  421.     if (NULL != event[e].action[a].cvalue)
  422.     {
  423.       free (event[e].action[a].cvalue);
  424.       event[e].action[a].cvalue = NULL;
  425.     }
  426.   }
  427.  
  428.   /* An event might have an effect on the locked target */
  429.   CheckLock();
  430. }
  431.